{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fisher判别（LDA）"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![image-2.png](https://img-blog.csdnimg.cn/20200505123848749.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1RpbWVfYm9vaw==,size_16,color_FFFFFF,t_70)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用二分类来分析，设样本数据集为D = { ( X , Y ) } ， X i 是 第 i 类 样 本 的 集 合 ， i ∈ {   0 , 1 } 要找的最佳投影为W。\n",
    "\n",
    "记mi为第i类样本质心,Ni为第i类的数量\n",
    "![image.png](https://img-blog.csdn.net/20180118162725885)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.最大类间离散度矩阵：即要投影后两个样本的质心离得越远越好。\n",
    "![image-6.png](https://img-blog.csdn.net/20180118162843127)\n",
    "\n",
    "2.最小类内离散度矩阵：即要使得投影后同一类的样本点尽可能聚拢在一起，离质心越近越好。\n",
    "![image.png](https://img-blog.csdn.net/20180118162737730)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fisher准则函数定义：\n",
    "![image-3.png](https://img-blog.csdn.net/20180118163104280)\n",
    "其中![image-4.png](https://img-blog.csdn.net/20180118163254326)\n",
    "是两类均值之差，是样本类内离散度。显然，应该使JF(w)的分子尽可能大而分母尽可能小，即应寻找使JF(w)尽可能大的w作为投影方向。但上式中并不显含w，因此须设法将JF(w)变成w的显函数。\n",
    "由各类样本的均值可推出：\n",
    "![image-5.png](https://img-blog.csdn.net/20180118163338127)\n",
    "这样，Fisher准则函数JF(w)的分子可写成：\n",
    "![image-6.png](https://img-blog.csdn.net/20180118163408057)\n",
    "因此也可得到：\n",
    "![image-7.png](https://img-blog.csdn.net/20180118163507002)\n",
    "将上述各式代入JF(w)，可得：\n",
    "![image-8.png](https://img-blog.csdn.net/20180118163540029)\n",
    "其中Sb为样本类间离散度矩阵，Sw为总样本类内离散度矩阵。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为求取极大值时的w*，我们采用拉格朗日乘子法求解。\n",
    "定义函数：\n",
    "![image-1.png](https://img-blog.csdn.net/20180118163826186)\n",
    "其中λ为拉格朗日乘子。将上式对w求偏导数，可得：\n",
    "![image-2.png](https://img-blog.csdn.net/20180118163856609)\n",
    "令偏导数为零，有:\n",
    "![image-3.png](https://img-blog.csdn.net/20180118163956851)\n",
    "其中w*就是JF(w)的极值解。因为Sw非奇异，将上式两边左乘 Sw的逆，可得：\n",
    "![image-4.png](https://img-blog.csdn.net/20180118164029903)\n",
    "上式为求一般矩阵Sw^(-1)*Sb的特征值问题\n",
    "利用![image-5.png](https://img-blog.csdn.net/20180118164243050)的定义\n",
    "将上式左边的SbW*写成：\n",
    "![image-6.png](https://img-blog.csdn.net/20180118164358699)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "令![image-1.png](https://img-blog.csdn.net/20180118164434272)\n",
    "这是一个标量。因此λw*可写成：\n",
    "![image-2.png](https://img-blog.csdn.net/20180118164617533)\n",
    "从而可得：\n",
    "![image-3.png](https://img-blog.csdn.net/20180118164701190)\n",
    "由于我们的目的是寻找最佳的投影方向，w*的比例因子对此并无影响，因此可忽略比例因子R/λ,有：\n",
    "![image-4.png](https://img-blog.csdn.net/20180118164732076)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "于是我们得到，使用Fisher准则求最佳法线向量的解为：  W* = S1^(-1)·（m1-m0），此时Fisher准则函数J（W）达到极大值。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(1)实现两类iris分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     0    1    2    3            4\n",
      "0  5.1  3.5  1.4  0.2  Iris-setosa\n",
      "1  4.9  3.0  1.4  0.2  Iris-setosa\n",
      "2  4.7  3.2  1.3  0.2  Iris-setosa\n",
      "3  4.6  3.1  1.5  0.2  Iris-setosa\n",
      "4  5.0  3.6  1.4  0.2  Iris-setosa\n",
      "5  5.4  3.9  1.7  0.4  Iris-setosa\n",
      "6  4.6  3.4  1.4  0.3  Iris-setosa\n",
      "7  5.0  3.4  1.5  0.2  Iris-setosa\n",
      "8  4.4  2.9  1.4  0.2  Iris-setosa\n",
      "9  4.9  3.1  1.5  0.1  Iris-setosa\n",
      "随机抽取第55个样本\n",
      "随机抽取的[[2.8 1.3]]属于 Ω2 类.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "import random\n",
    "\n",
    "#  把来自两类w1，w2的训练样本集X分成与w1和w2分别对应的训练样本集X1和X2\n",
    "def load_data():\n",
    "    path = 'Iris.data'\n",
    "    data = pd.read_csv(path,header=None)\n",
    "    print(data.head(10))\n",
    "    x1 = data.loc[0:49,[1,3]].values\n",
    "    x2 = data.loc[50:99,[1,3]].values\n",
    "    x3 = data.loc[0:99,[1,3]].values\n",
    "    return x1,x2,x3\n",
    "x,y,z = load_data()\n",
    "x1 = np.mat(x)\n",
    "x2 = np.mat(y)\n",
    "x3 = np.mat(z)  # 用于随机测试\n",
    "\n",
    "#  计算各类样本的均值向量 mi\n",
    "def calculate_mean(samples):\n",
    "    mean_mat = np.mean(samples,axis=0)\n",
    "    return mean_mat.T\n",
    "\n",
    "\n",
    "#  计算样本类内离散度矩阵\n",
    "def calculate_inclass_sactter(input_class,input_mean):\n",
    "    sample_mean = input_class - input_mean\n",
    "    Sk = ([[0,0],[0,0]])\n",
    "    for i in range(len(sample_mean)):\n",
    "        x = np.mat(sample_mean[i]).T\n",
    "        Sk += np.dot(x,x.T)\n",
    "    return Sk\n",
    "\n",
    "# #  计算 g(x) = W.T 判断g(x)与Y_0的大小，大于Y0属于Ω1类，小于属于Ω2类\n",
    "def judge_class(input_element):\n",
    "    Y_0 = (w.T * (m1+m2))/2\n",
    "    g_x = w.T * input_element.T\n",
    "    flag = g_x[(0,0)] - Y_0[(0,0)]\n",
    "    if flag > 0:\n",
    "        print(f\"随机抽取的{input_element}属于 Ω1 类.\")\n",
    "    elif flag < 0:\n",
    "        print(f\"随机抽取的{input_element}属于 Ω2 类.\")\n",
    "    else:\n",
    "        print(f\"无法确定随机抽取的{input_element}属于哪一类.\")\n",
    "\n",
    "# ### ---> 画出分类线以及投影线，以及投影后的点\n",
    "def new_coordinate(input_class,input_color):\n",
    "    for i in range(len(input_class)):\n",
    "        x_new_1 = (input_class[i].tolist())[0]\n",
    "        mod_w_1 = math.sqrt(w1[0]**2 + w1[1]**2)\n",
    "        dot_multi_1 = w1[0] * x_new_1[0] + w1[1] * x_new_1[1]\n",
    "        #投影后的坐标矩阵\n",
    "        x_new_mat_1 = dot_multi_1 / mod_w_1 * (w.T/mod_w_1)\n",
    "        plt.scatter(x_new_mat_1[0,0], x_new_mat_1[0,1], color=input_color, marker='x')\n",
    "\n",
    "#均值        \n",
    "m1 = calculate_mean(x1) \n",
    "m2 = calculate_mean(x2)\n",
    "\n",
    "#离散度矩阵\n",
    "sk1 = calculate_inclass_sactter(x1,m1.T) \n",
    "sk2 = calculate_inclass_sactter(x2,m2.T)\n",
    "\n",
    "#计算总类内离散度矩阵 Sw = S1 + S2\n",
    "Sw = sk1 + sk2\n",
    "\n",
    "#计算Sw的逆矩阵\n",
    "Sw_inv = np.mat(Sw).I\n",
    "\n",
    "#求解权向量：w = Sw(逆)(m1-m2)\n",
    "w = (Sw_inv * (np.mat(m1 - m2)))\n",
    "w1 = ((w.T).tolist())[0]  #取矩阵中的两个元素，以便接下来的向量运算\n",
    "\n",
    "random_number = random.randint(0,99)\n",
    "print(f\"随机抽取第{random_number}个样本\")\n",
    "judge_class(x3[random_number])\n",
    "\n",
    "#画出两条直线直观观察\n",
    "x_x = np.linspace(0, 8, 10)\n",
    "x_x_1 = np.linspace(-2, 2, 10)\n",
    "y_y = -(w1[0] * x_x) / w1[1]\n",
    "y_y_1 = (w1[1] * x_x_1) / w1[0]\n",
    "\n",
    "new_coordinate(x1,'red') #投影点\n",
    "new_coordinate(x2,'green')\n",
    "\n",
    "plt.plot(x_x, y_y)\n",
    "plt.plot(x_x_1, y_y_1)\n",
    "plt.scatter(x[:49,0],x[:49,1],color='red',marker='o')\n",
    "plt.scatter(y[:49,0],y[:49,1],color='blue',marker='x')\n",
    "plt.xlabel('length of petal')\n",
    "plt.ylabel('length of scape')\n",
    "plt.title('Fisher Criterion')\n",
    "plt.grid()\n",
    "plt.axis('equal')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(2)实现实验书中三类(3维特征)数据分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(10, 3)\n",
      "测试的[[-0.7    0.58   0.089]]属于 w1 类.\n",
      "测试的[[ 0.047 -0.4    1.04 ]]属于 w2 类.\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "w1 = np.array([[-0.4,0.58,0.089],[-0.31,0.27,-0.04],[-0.38,0.055,-0.035],[-0.15,0.53,0.011],\n",
    "             [-0.35,0.47,0.034],[-0.17,0.69,0.1],[-0.011,0.55,-0.18],[-0.27,0.61,0.12],\n",
    "             [-0.065,0.49,0.0012],[-0.12,0.054,-0.063]])\n",
    "w2 = np.array([[0.8,1.6,-0.014],[1.1,1.6,0.48],[-0.44,-0.41,0.32],[0.047,-0.45,1.4],\n",
    "             [0.28,0.35,3.1],[-0.39,-0.48,0.11],[0.34,-0.079,0.14],[-0.3,-0.22,2.2],\n",
    "             [1.1,1.2,-0.46],[0.18,-0.11,-0.49]])\n",
    "w3 = np.array([[1.58,2.32,-5.8],[0.67,1.58,-4.78],[1.04,1.01,-3.63],[-1.49,2.18,-3.39],\n",
    "             [-0.41,1.21,-4.73],[1.39,3.61,2.87],[1.2,1.4,-1.89],[-0.92,1.44,-3.22],\n",
    "             [0.45,1.33,-4.38],[-0.76,0.84,-1.96]])\n",
    "# print(w1.shape)\n",
    "w1 = np.mat(w1)\n",
    "w2 = np.mat(w2)\n",
    "w3 = np.mat(w3)\n",
    "print(w1.shape)\n",
    "#测试数据 xx1=[-0.7,0.58,0.089].T  xx2=[0.047,-0.4,1.04].T\n",
    "\n",
    "#  计算各类样本的均值向量 mi\n",
    "def calculate_mean(samples):\n",
    "    mean_mat = np.mean(samples,axis=0)\n",
    "    return np.mat(mean_mat).T\n",
    "\n",
    "\n",
    "#  计算样本类内离散度矩阵\n",
    "def calculate_inclass_sactter(input_class,input_mean):\n",
    "    sample_mean = input_class - input_mean\n",
    "    Sk = ([[0,0,0],[0,0,0],[0,0,0]])\n",
    "    for i in range(len(sample_mean)):\n",
    "        # x = np.mat(sample_mean[i]).T\n",
    "        x = sample_mean[i].T\n",
    "        Sk += np.dot(x,x.T)\n",
    "    return Sk\n",
    "\n",
    "#  计算 g(x) = W.T 判断g(x)与Y_0的大小，大于Y0属于Ω1类，小于属于Ω2类\n",
    "def judge_class(input_element):\n",
    "    Y_0 = (w1_2.T * (m1+m2))/2\n",
    "    g_x = w1_2.T * input_element.T\n",
    "    flag = g_x - Y_0\n",
    "    if flag > 0:\n",
    "        print(f\"测试的{input_element}属于 w1 类.\")\n",
    "    elif flag < 0:\n",
    "        print(f\"测试的{input_element}属于 w2 类.\")\n",
    "    else:\n",
    "        print(f\"无法确定测试的{input_element}属于哪一类.\")\n",
    "\n",
    "\n",
    "#均值\n",
    "m1 = calculate_mean(w1) \n",
    "m2 = calculate_mean(w2)\n",
    "m3 = calculate_mean(w3)\n",
    "\n",
    "#离散度矩阵\n",
    "sk1 = calculate_inclass_sactter(w1,m1.T) \n",
    "sk2 = calculate_inclass_sactter(w2,m2.T)\n",
    "sk3 = calculate_inclass_sactter(w3,m3.T)\n",
    "\n",
    "#计算总类内离散度矩阵 Sw = S1 + S2\n",
    "Sw1_2 = sk1 + sk2\n",
    "Sw1_3 = sk1 + sk3\n",
    "Sw2_3 = sk2 + sk3\n",
    "\n",
    "#计算Sw的逆矩阵\n",
    "Sw_inv1_2 = np.mat(Sw1_2).I\n",
    "Sw_inv1_3 = np.mat(Sw1_3).I\n",
    "Sw_inv2_3 = np.mat(Sw2_3).I\n",
    "\n",
    "#求解权向量：w = Sw(逆)(m1-m2)\n",
    "w1_2 = (Sw_inv1_2 * (np.mat(m1 - m2)))\n",
    "# print(w1_2)\n",
    "w1_3 = (Sw_inv1_3 * (np.mat(m1 - m3)))\n",
    "w2_3 = (Sw_inv2_3 * (np.mat(m2 - m3)))\n",
    "\n",
    "w_1_2 = ((w1_2.T).tolist())[0]  #取矩阵中的元素，以便接下来的向量运算\n",
    "# print(w_1_2)\n",
    "w_1_3 = ((w1_3.T).tolist())[0]\n",
    "w_2_3 = ((w2_3.T).tolist())[0]\n",
    "\n",
    "#判别属于哪一类\n",
    "xx1 = np.mat([-0.7,0.58,0.089])\n",
    "xx2=np.mat([0.047,-0.4,1.04])\n",
    "judge_class(xx1)\n",
    "judge_class(xx2)\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = Axes3D(fig)\n",
    "z1 = ((w1_2.T * w1.T).tolist())[0]\n",
    "z2 = ((w1_2.T * w2.T).tolist())[0]\n",
    "# print(z1)\n",
    "# print(z2)\n",
    "x = np.linspace(-1,1,10)\n",
    "\n",
    "for i in range(10):\n",
    "    plt.plot(z1[i]*w_1_2[0],z1[i]*w_1_2[1],z1[i]*w_1_2[2],color='red',marker='x')\n",
    "    plt.plot(z2[i]*w_1_2[0],z2[i]*w_1_2[1],z2[i]*w_1_2[2], color='green', marker='x')\n",
    "plt.plot(x,x*w_1_2[1]/w_1_2[0],x*w_1_2[2]/w_1_2[0])\n",
    "ax.scatter(w1[:,0],w1[:,1],w1[:,2], c='r',marker='o')\n",
    "ax.scatter(w2[:,0],w2[:,1],w2[:,2], c='g',marker='o')\n",
    "# ax.scatter(w3[:,0],w3[:,1],w3[:,2], c='g',marker='o')\n",
    "ax.set_zlabel('Z', fontdict={'size': 20, 'color': 'red'})\n",
    "ax.set_ylabel('Y', fontdict={'size': 20, 'color': 'red'})\n",
    "ax.set_xlabel('X', fontdict={'size': 20, 'color': 'red'})\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "补充：三类判别可以看作一个个的二类判别，只需要修改上述程序中的输入的哪一类的权向量即可（w1_2，w1_3，w2_3----分别对应哪两类）。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}